perm filename NPROM.FAI[CMS,LCS]5 blob
sn#353857 filedate 1978-05-11 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00012 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 NEW MONITOR AND BOOTSTRAP PROM.
C00003 00003 RESET
C00005 00004 Disk load routine
C00007 00005 START
C00010 00006 Clear screen sub
C00011 00007 Display DDT
C00014 00008 CKCMD: CMPI "/" Examine
C00015 00009 PRINT ADDRESS/VAL
C00017 00010 Reset chr dpy
C00019 00011 DISPLAY CHR
C00021 00012 Paper tape loader Interupt driven?
C00023 ENDMK
C⊗;
; NEW MONITOR AND BOOTSTRAP PROM.
.INSERT ASMBL.FAI
; ZPAGE RAM
TFLG: 0
VAL: 0
ADR: 0
0
BLOCK 15 ;OLD DDT RAM
CUR: 0 ;Cursor
0
SD: 0 ;Screen edges
ED: 0
RAS: 0 ;Dpy control defaults
ROW: 0
DPY: 0
MIX: 0
BRCODE: 0 ;Default bit rate
RSCODE: 0 ;Default acia control word
KBCODE: 0 ;Default keyboard control word
;RESET
LOC 177274 ;LOC 177000
SRSTR←UNDEF ;System reset register
RSTREG←UNDEF ;POWER ON RESET REG
PORCK: BIT RSTREG ;Check if power on reset
BVS CKMODE
RST: LDXI 377 ;Stack depth
TXS ;Set stack
CLD ;Clear decimal mode
JSR CLRDPY ;Clear screen
JSR SETVEC ;Setup default IRQ vectors
JSR JMPSET ;Reset ram jumps
;Setup start addresses
;CKMODE: PHA ;Save A??
;Reset system
LDA RSTREG
ANDI 60 ;RST mode bits
BNE CKM1
JMP OLDDDT ;Old DDT
CKM1: CMPI 40
BCS CKM2
JMP LEDDDT ;KB LED DDT
CKM2: BNE FBOOT
JMP DPYDDT ;Display DDT
DSKSEL←176437;Floppy select
FBAD←1400 ;Floppy bootstrap start address
IBMR←163 ;IBM read command
FBOOT: LDAI RTI ;Dissable non maskable interupt
STA NMIV
JSR RESTOR ;Restore?
BIT RSTREG ;Check if power on reset
BVS NOPOR
;Wait for disk
NOPOR: LDAI 0 ;Floppy boot start addr. low
STAZ FBADL
LDAI 3 ;Fboot start addr. high
STAZ FBADH
LDYI 377 ;Read length
LDAI IBMR ;Read IBM sector(s)
STAZ FDC
JSR FLOAD ;Load from disk
;Check for error
JMP FBAD
;Disk load routine
FDSKC←176420 ;DISK COMMAND REGISTER
FDSKT←176421 ;DISK TRACK REGISTER
FDSKS←176422 ;DISK SECTOR REGISTER
FDSKD←176423 ;DISK DATA REGISTER
FLOAD: LDAI 34 ;Reset disk servo
STA DSKSEL
LDAZ DSEL ;20 = Head unloaded and
STA DSKSEL ;disk init disabled.
LDAZ SEC
STA FDSKS ;Setup sector #
;Init data reg?
LDXI 2 ;Setup timer jump
JLOOP: LDAX RJMP
STAX NMIV
DEX
BPL JLOOP
LDAI UNDEF
STA RTCAH ;Setup time out
LDAI 17 ;17 = Load, /16, NMI, IEN
STA RTCAC
LDAI 163 ;Read 1 IBM sector (128 bytes)
STA FDSKC
LDYI 0
DSKL: BIT DSKSEL
BPL DSKL ;Wait until byte ready
LDA FDSKD
STAIY FBAD ;Load it
INY
BNE DSKL
LDAI 0
RSTT: LDXI 0 ;Disable timer
STA RTCAC
;Set / reset error bits
RTS
RJMP: JMP FBTO
FBTO: PLA ;Flush stack
PLA
PLA
LDAI TOBIT ;Set time out error bit
JMP RSTT
;START
BOOTS←1000 ;BOOTSTRAP START ADDRESS
DMAINT:
DSKINT:
JMP BOOTS ;JUMP TO BOOT START
;Reset ram jumps.
JMPSET: LDXI UNDEF ;Number of jumps * 2
JSET: LDAX JMPDEF
STAZX RJMP ;Jump table setup loop
DEX
BPL JSET
RTS
;Default ram jumps
JMPDEF:
;Setup interrupt vectors.
IVECT←176360 ;Ram interrupt vector table address
SETVEC: LDXI 17 ;Number of vectors * 2
IVSET: LDAX IVDEF ;Default vector setup loop
STAX IVECT
DEX
BPL IVSET
PRIC←176436 ;PRI control register
LDAI UNDEF ;Setup pri control register.
STA PRIC
RTS
;Default interupt vectors.
IVDEF: IVERR ;Error
PROM
IVERR ;Error
PROM
UNLOAD ;Disable head preload
PROM
MODINT ;TTY default
PROM
DMAINT ;Disk load and boot
PROM
DSKINT ;Disk load and boot
PROM
;Clear screen sub
CLRDPY: LDAI 0
STAZ CUR
LDAZ SD ;Get top of screen
STAZ CUR+1
LDYI 0
LDAI " " ;<Space>
CLRL: STAIY CUR
INY
BNE CLRL
INCZ CUR+1
LDXZ CUR+1
CPXZ ED ;Bottom of screen
BCC CLRL
RTS
;SETUP DMA
FDMAA←176400 ;FDSK DMA ADDRESS REGISTER
FDMAC←176401 ;FDSK COUNT REGISTER
DMACON←176410;DMA COMMAND REGISTER
LDAI 0 ;RESET DMA
STA DMACON
STA FDMAA ;SETUP DMA ADDRESS
LDAI 2 ;1000
STA FDMAA
LDAI 377 ;SETUP DMA COUNT
STA FDMAC
LDAI 201 ;CNT=512-1
STA FDMAC
LDAI 141 ;ENABLE FDSK DMA
IVERR ;Error
;Display DDT
DPYDDT: LDAI 20 ;Unload disk head??
STA DSKSEL
JSR RCDPY ;Setup display defaults
;Reset ACIA(S), BRG, MOD
;Setup KB chr map?
DBRIN0: PHA
LDAI RTI ;Disable NMI
STA NMIV
PLA
DBRIN1: JSR SVSTAT ;Save state?
JSR SETKB
JSR SETDPY
;Init I/O?
;DPY DDT loop
PCR: LDAI 15 ;PRINT <cr>.
JSR RPCHR
PLF: LDAI 12
JSR RPCHR ;PRINT <cr>
GNEXT: JSR RGCHR ;Wait for next chr
ANDI 177
;RAM JUMP
ECHO: JSR RPCHR ;Echo it
CMPI 12 ;<lf>
BEQ LF
CMPI 60 ;Check for octal digit
BCC CKCMD
CMPI 70
BCS CKCMD
ANDI 7
LDXI 3
SHFT: ASLZ TMP
ROLZ TMP+1
DEX
BNE SHFT
ORAZ TMP
STAZ TMP
INCZ TFLG ;Set number flag
JMP GNEXT ;Wait for next chr
CKCMD: CMPI "/" ;Examine
BEQ SETAD
CMPI UNDEF ;"↑"
BEQ UPARO
CMPI UNDEF ;<Tab>
BEQ TAB
CMPI UNDEF ;<Btab>
BEQ BTAB
CMPI UNDEF ;<Baddr>
BEQ BADDR
CMPI UNDEF ;<Jaddr>
BEQ JADDR
CMPI "P" ;Proceed
BEQ GO
CMPI "T" ;TTY
BEQ TTY
CMPI UNDEF ;TVT
BEQ TVT
CMPI "B" ;Modem boot
BEQ MBOOT
CMPI "L" ;Modem load
BEQ MLOAD
CMPI "U" ;Modem unload
BEQ MUNLOD
ERROR: JMP GNEXT
;PRINT ADDRESS/VAL
PAV: LDXI 0
LDAI 1 ;# OF DIGITS
STAZ NDIG
STAZ TFLG ;SET BIT MASK
LDYI 2 ;# OF BITS + C
JSR RLOOP ;PRINT "0" OR "1"
LDAI 5
STAZ NDIG
LDAI 7
STAZ TFLG
JSR CLOOP ;PRINT 5 OCTAL DIGITS
LDAI "/"
JSR PCHR ;PRINT "/"
LDAI 1
STAZ NDIG
LDYI 3
STYZ TFLG
JSR DLOOP ;PRINT "0" - "3"
LDAI 2
STAZ NDIG
LDAI 7
STAZ TFLG
JSR CLOOP ;PRINT 2 OCTAL DIGITS
RTS
CLOOP: LDYI 3 ;FOR 3 BITS PER DIGIT
RLOOP: ROLZ VAL ;ROTATE ADDRESS AND VALUE
ROLZ ADR
ROLZ ADR+1
DLOOP: DEY
BNE RLOOP
LDAZ VAL ;GET NEXT DIGIT
ANDZ TFLG
ORAI 60 ;CONVERT TO ASCII
JSR RPCHR ;PRINT IT (Ram jump)
DECZ NDIG
BNE CLOOP ;NEXT DIGIT
RTS
;Reset chr dpy
RCDPY: LDAI 0 ;Reset cursor
STAZ CUR
LDAI DPYRAM
STAZ CUR+1
RASTER←171760;RASTER OFFSET
CHRROW←171761;CHR ROW OFFSET
DPYC←171764 ;VIDIO CONTROL
VMIX←171765 ;VIDIO MIXER
LDAI 14 ;SET UP DPY DEFAULTS
STAZ RAS ;SHOULD BE 0,0
LDAI 377
STAZ ROW
LDAI 100 ;CURSOR ENABLE
STAZ DPY
LDAI 1 ;NORMAL MIX
STAZ MIX
;Setup screen edges
LDAI 200
STAZ SD ;Upper edge
LDAI 210
STAZ ED ;lower edge
;Reset key board defaults
KBD←173370 ;KB DATA REGISTER
KBC←173371 ;KB CONTROL REGISTER
LDAI UNDEF ;RESET KB DEFAULT
STAZ KBCODE
RTS
;Reset brate and acia defaults
RSDEF←25 ;ACIA CONTROL DEFAULT
RMOD: LDAI 15 ;Set bit rate to 300
STAZ BRCODE
LDAI RSDEF ;SETUP ACIA DEFAULT
STAZ RSCODE
LDAI 3
STA ACIAC ;Reset ACIA?
RTS
;DISPLAY CHR
PDPY: LDYI 0 ;?
STAIY CUR ;WRITE CHR INTO CHRDPY MEM
INCZ CUR ;INCREMENT CURSOR
LDAZ CUR
ANDI 77 ;CHECK IF OFF RIGHT EDGE
BEQ CRLF ;CLEAR NEXT LINE
CURREG←171762 ;CURSOR CONTROL REGISTERS
UPCUR: LDAZ CUR ;UPDATE CURSOR
STA CURREG
LDAZ CUR+1
STA CURREG+1
RTS
CRLF: LDAZ CUR ;FIX CURSOR
SEC
SBCI 100 ;Chr per line
STAZ CUR ;Fall through to line feed
;LINE FEED
LF: CLC
LDAZ CUR
ADCI 100 ;NEXT LINE
STAZ CUR
BCC NOTOFF
INCZ CUR+1
LDAZ CUR+1
CMPZ ED ;BOTTOM OF SCREEN
BEQ GLITCH
;Clear to end of line sub
CTEOL: LDAZ CUR
ANDI 77
EORI 77
TAY
LDAI 40 ;<space>
CLR: STAIY CUR
DEY
BNE CLR
RTS
GLITCH:
RTS
;Paper tape loader Interupt driven?
PTLOAD:
PTW1: BIT CRB0 ;Wait for chr
BPL PTW1
LDA PRA0 ;Get chr
CMPI UNDEF
BEQ PTW1 ;Check if record mark
;Intel hex, PDP-11 bin, or ? (cksum, etc.)
;Prom reset and interupt vectors
LOC 200266 ;LOC 177772
NMIV: NMIINT ;Prom Non maskable interupt vector
PROM
RSTV: RST ;Prom reset vector
PROM
;Prom interupt request vector
IRQV: 0 ;0 for PIV enable
0
END